package org.jeecg.modules.rule.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.meta.entity.SysTableinfo;
import org.jeecg.modules.meta.service.ISysTableinfoService;
import org.jeecg.modules.pubmgr.entity.SysProjectAuth;
import org.jeecg.modules.pubmgr.service.ISysProjectAuthService;
import org.jeecg.modules.rule.entity.OpersscTabdetail;
import org.jeecg.modules.rule.entity.OpersscFo;
import org.jeecg.modules.rule.service.IOpersscTabdetailService;
import org.jeecg.modules.rule.service.IOpersscFoService;
import org.jeecg.modules.rule.vo.OpersscFoPage;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
* @Description: 手工脱敏表
* @Author: jeecg-boot
* @Date:   2019-06-17
* @Version: V1.0
*/
@RestController
@RequestMapping("/rule/OpersscFo")
@Slf4j
public class OpersscFoController {
   @Autowired
   private IOpersscFoService OpersscFoService;
   @Autowired
   private IOpersscTabdetailService opersscTabdetailService;

   @Autowired
   ISysTableinfoService iSysTableinfoService;

   @Autowired
   ISysProjectAuthService iSysProjectAuthService;
   /**
     * 分页列表查询
    * @param OpersscFo
    * @param pageNo
    * @param pageSize
    * @param req
    * @return
    */
   @GetMapping(value = "/list")
   public Result<IPage<OpersscFo>> queryPageList(OpersscFo OpersscFo,
                                     @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                     @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                     HttpServletRequest req) {
       Result<IPage<OpersscFo>> result = new Result<IPage<OpersscFo>>();
       QueryWrapper<OpersscFo> queryWrapper = QueryGenerator.initQueryWrapper(OpersscFo, req.getParameterMap());
       Page<OpersscFo> page = new Page<OpersscFo>(pageNo, pageSize);

       //设置应用工程过滤
       List<String> projectList = getProjectListByUserId();
       if(null == projectList || projectList.size() == 0){
           result.setSuccess(true);
           result.setResult(page);
           return result;
       }

       queryWrapper.in("fd_project", projectList);
       IPage<OpersscFo> pageList = OpersscFoService.page(page, queryWrapper);
       result.setSuccess(true);
       result.setResult(pageList);
       return result;
   }

    private List<String> getProjectListByUserId() {
        List<String> projectList = new ArrayList<>();

        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        //用户id
        String userId = sysUser.getId();
        //获取用户对应的工程list
        QueryWrapper<SysProjectAuth> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("fd_userId", userId);
        List<SysProjectAuth> sysProjectAuths = iSysProjectAuthService.list(queryWrapper);

        if (null != sysProjectAuths && sysProjectAuths.size() > 0) {
            for (SysProjectAuth sysProjectAuth : sysProjectAuths){
                projectList.add(sysProjectAuth.getFdProjid());
            }
        }
        return projectList;
    }
   /**
     *   添加
    * @param OpersscFoPage
    * @return
    */
   @PostMapping(value = "/add")
   public Result<OpersscFo> add(@RequestBody OpersscFoPage OpersscFoPage) {
       Result<OpersscFo> result = new Result<OpersscFo>();
       try {
           OpersscFo OpersscFo = new OpersscFo();
           BeanUtils.copyProperties(OpersscFoPage, OpersscFo);

           OpersscFoService.save(OpersscFo);
           result.success("添加成功！");
       } catch (Exception e) {
           log.error(e.getMessage(),e);
           result.error500("操作失败");
       }
       return result;
   }

   /**
     *  编辑
    * @param OpersscFoPage
    * @return
    */
   @PutMapping(value = "/edit")
   public Result<OpersscFo> edit(@RequestBody OpersscFoPage OpersscFoPage) {
       Result<OpersscFo> result = new Result<OpersscFo>();
       OpersscFo OpersscFo = new OpersscFo();
       BeanUtils.copyProperties(OpersscFoPage, OpersscFo);
       OpersscFo OpersscFoEntity = OpersscFoService.getById(OpersscFo.getId());
       if(OpersscFoEntity==null) {
           result.error500("未找到对应实体");
       }else {
           OpersscFoService.updateById(OpersscFo);
           result.success("修改成功!");
       }

       return result;
   }

   /**
     *   通过id删除
    * @param id
    * @return
    */
   @DeleteMapping(value = "/delete")
   public Result<OpersscFo> delete(@RequestParam(name="id",required=true) String id) {
       Result<OpersscFo> result = new Result<OpersscFo>();
       OpersscFo OpersscFo = OpersscFoService.getById(id);
       if(OpersscFo==null) {
           result.error500("未找到对应实体");
       }else {
           OpersscFoService.delMain(id);
           result.success("删除成功!");
       }

       return result;
   }

   /**
     *  批量删除
    * @param ids
    * @return
    */
   @DeleteMapping(value = "/deleteBatch")
   public Result<OpersscFo> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
       Result<OpersscFo> result = new Result<OpersscFo>();
       if(ids==null || "".equals(ids.trim())) {
           result.error500("参数不识别！");
       }else {
           this.OpersscFoService.removeByIds(Arrays.asList(ids.split(",")));
           result.success("删除成功!");
       }
       return result;
   }

   /**
     * 通过id查询
    * @param id
    * @return
    */
   @GetMapping(value = "/queryById")
   public Result<OpersscFo> queryById(@RequestParam(name="id",required=true) String id) {
       Result<OpersscFo> result = new Result<OpersscFo>();
       OpersscFo OpersscFo = OpersscFoService.getById(id);
       if(OpersscFo==null) {
           result.error500("未找到对应实体");
       }else {
           result.setResult(OpersscFo);
           result.setSuccess(true);
       }
       return result;
   }

   //===========================以下是子表信息操作相关API====================================

   /**
     * 通过主表id查询手工脱敏运行详情表
    * @param mainId
    * @return
    */

   @GetMapping(value = "/listOpersscTabdetailByMainId")
   public Result<IPage<OpersscTabdetail>> queryOpersscTabdetailListByMainId(OpersscTabdetail opersscTabdetail,
                                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                                            @RequestParam(name = "fdTableName", required = false) String fdTableName,
                                                                            HttpServletRequest req) {
       Result<IPage<OpersscTabdetail>> result = new Result<>();
       if (opersscTabdetail.getFdSscid() != null) {
           QueryWrapper<OpersscTabdetail> queryWrapper = QueryGenerator.initQueryWrapper(opersscTabdetail, req.getParameterMap());
           if (StringUtils.isNotEmpty(fdTableName)) {
               List<String> tabIdList = getTabIdListByName(fdTableName);
               if (tabIdList == null || tabIdList.size() == 0) {
                   return null;
               }
               queryWrapper.in("fd_table_id", tabIdList);
           }
           Page<OpersscTabdetail> page = new Page<>(pageNo, pageSize);
           IPage<OpersscTabdetail> pageList = opersscTabdetailService.page(page, queryWrapper);
           result.setSuccess(true);
           result.setResult(pageList);
           return result;
       }else {
           return null;
       }
   }
    private List<String> getTabIdListByName(String tableName) {
        QueryWrapper<SysTableinfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("fd_tablename", tableName);
        List<SysTableinfo> list = iSysTableinfoService.list(queryWrapper);
        if (null == list || list.size() == 0) {
            return new ArrayList<>();
        }

        return covTableInfoString(list);
    }


    private List<String> covTableInfoString(List<SysTableinfo> list) {
        List<String> strings = new ArrayList<>();
        for (SysTableinfo sysTableinfo : list) {
            strings.add(sysTableinfo.getFdTableid());
        }
        return strings;
    }

   /**
    * 添加手工脱敏运行详情表
    *
    * @param opersscTabdetail
    * @return
    */
   @PostMapping(value = "/addOpersscTabdetail")
   public Result<OpersscTabdetail> addOpersscTabdetail(@RequestBody OpersscTabdetail opersscTabdetail) {
       Result<OpersscTabdetail> result = new Result<>();
       try {
           boolean ok = opersscTabdetailService.save(opersscTabdetail);
           if (ok) {
               result.setSuccess(true);
               result.setMessage("添加手工脱敏运行详情表成功.");
           } else {
               result.setSuccess(false);
               result.setMessage("添加手工脱敏运行详情表失败!");
           }
           return result;
       } catch (Exception e) {
           e.fillInStackTrace();
           result.setSuccess(false);
           result.setMessage("添加手工脱敏运行详情表过程中出现了异常: " + e.getMessage());
           return result;
       }
   }

   /**
    * 编辑手工脱敏运行详情表
    *
    * @param opersscTabdetail
    * @return
    */
   @PutMapping("/editOpersscTabdetail")
   public Result<OpersscTabdetail> editOpersscTabdetail(@RequestBody OpersscTabdetail opersscTabdetail) {
       Result<OpersscTabdetail> result = new Result<>();
       try {
           boolean ok = opersscTabdetailService.updateById(opersscTabdetail);
           if (ok) {
               result.setSuccess(true);
               result.setMessage("更新手工脱敏运行详情表成功.");
           } else {
               result.setSuccess(false);
               result.setMessage("更新手工脱敏运行详情表失败!");
           }
           return result;
       } catch (Exception e) {
           result.setSuccess(false);
           result.setMessage("更新数据过程中出现异常啦: " + e.getMessage());
           return result;
       }
   }

   /**
    * 通过id删除手工脱敏运行详情表
    *
    * @param id
    * @return
    */
   @DeleteMapping(value = "/deleteOpersscTabdetail")
   public Result<OpersscTabdetail> deleteOpersscTabdetail(@RequestParam(name = "id", required = true) String id) {
       Result<OpersscTabdetail> result = new Result<>();
       try {
           boolean ok = opersscTabdetailService.removeById(id);
           if (ok) {
               result.setSuccess(true);
               result.setMessage("删除手工脱敏运行详情表成功.");
           } else {
               result.setSuccess(false);
               result.setMessage("删除手工脱敏运行详情表失败!");
           }
           return result;
       } catch (Exception e) {
           result.setSuccess(false);
           result.setMessage("删除手工脱敏运行详情表过程中出现异常啦: " + e.getMessage());
           return result;
       }
   }

   /**
    * 批量删除手工脱敏运行详情表
    *
    * @param ids
    * @return
    */
   @DeleteMapping(value = "/deleteBatchOpersscTabdetail")
   public Result<OpersscTabdetail> deleteBatchOpersscTabdetail(@RequestParam(name = "ids", required = true) String ids) {
       Result<OpersscTabdetail> result = new Result<OpersscTabdetail>();
       if (ids == null || "".equals(ids.trim())) {
           result.error500("参数不识别！");
       } else {
           this.opersscTabdetailService.removeByIds(Arrays.asList(ids.split(",")));
           result.success("删除成功!");
       }
       return result;
   }


   /**
    * 导出excel
    *
    * @param request
    * @param response
    */
   @RequestMapping(value = "/exportXls")
   public ModelAndView exportXls(OpersscFo opersscFoQuery,HttpServletRequest request, HttpServletResponse response) {
       // Step.1 组装查询条件
       QueryWrapper<OpersscFo> queryWrapper = QueryGenerator.initQueryWrapper(opersscFoQuery, request.getParameterMap());

       //Step.2 AutoPoi 导出Excel
       ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
       List<OpersscFoPage> pageList = new ArrayList<OpersscFoPage>();
       List<OpersscFo> OpersscFoList = OpersscFoService.list(queryWrapper);
       for (OpersscFo OpersscFo : OpersscFoList) {
           OpersscFoPage vo = new OpersscFoPage();
           BeanUtils.copyProperties(OpersscFo, vo);
           List<OpersscTabdetail> opersscTabdetailList = opersscTabdetailService.selectByMainId(OpersscFo.getId());
           vo.setOpersscTabdetailList(opersscTabdetailList);
           pageList.add(vo);
       }
       //导出文件名称
       mv.addObject(NormalExcelConstants.FILE_NAME, "手工脱敏表列表");
       mv.addObject(NormalExcelConstants.CLASS, OpersscFoPage.class);
       mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("手工脱敏表列表数据", "导出人:Jeecg", "导出信息"));
       mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
       return mv;
   }

   /**
    * 通过excel导入数据
    *
    * @param request
    * @param response
    * @return
    */
   @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
   public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
       MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
       Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
       for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
           MultipartFile file = entity.getValue();// 获取上传文件对象
           ImportParams params = new ImportParams();
           params.setTitleRows(2);
           params.setHeadRows(1);
           params.setNeedSave(true);
           try {
               List<OpersscFoPage> list = ExcelImportUtil.importExcel(file.getInputStream(), OpersscFoPage.class, params);
               for (OpersscFoPage page : list) {
                   OpersscFo po = new OpersscFo();
                   BeanUtils.copyProperties(page, po);
                   OpersscFoService.saveMain(po, page.getOpersscTabdetailList());
               }
               return Result.ok("文件导入成功！数据行数:" + list.size());
           } catch (Exception e) {
               log.error(e.getMessage(),e);
               return Result.error("文件导入失败:"+e.getMessage());
           } finally {
               try {
                   file.getInputStream().close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       return Result.ok("文件导入失败！");
   }
}
